package com.dongdongshop.shril;

import com.alibaba.dubbo.config.annotation.Reference;
import com.dongdongshop.pojo.seller.TbSeller;
import com.dongdongshop.service.seller.SellerService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

public class UserRealm extends AuthorizingRealm {

    @Reference
    private SellerService sellerService;

    /**
     * 授权
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

        return null;
    }

    /**
     * 认证
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //编写登录验证逻辑
        UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken;
        //调用数据库根据用户名查出用户
        TbSeller tbSeller = sellerService.getSellerDetailed(token.getUsername());
        //判断用户是否存在
        if (tbSeller == null){
            return null;
        }
        if (!"1".equals(tbSeller.getStatus())){
            return null;
        }
        //判断密码
        //第一个参数，为假如密码正确  也就是说登录成功后用户对象 相当于我们以前写的登录成功后用户放入session的意思
        //第二个参数，数据库查询出来的密码 shior会自动帮我们校验密码是否正确
        //第三个参数，假如密码正确也就是说登录成功后用户名

        //盐 就相当于秘钥
        //shior 的加密方式，通过盐 + 次数 进行哈希加密
        //比如说 1234 明文 先把1234和 某一个字符串（盐）一起加密
        return new SimpleAuthenticationInfo(tbSeller,tbSeller.getPassword(),ByteSource.Util.bytes(tbSeller.getSalt()),tbSeller.getLinkmanName());
    }

}
